package cn.anzhiyublog.staranimegallery.service;

import cn.anzhiyublog.staranimegallery.model.domain.User;
import cn.anzhiyublog.staranimegallery.model.dto.user.*;
import cn.anzhiyublog.staranimegallery.model.vo.UserVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 用户业务层接口
 *
 * @author 安知一只鱼
 */
public interface UserService extends IService<User> {

    /**
     * 注册业务
     */
    long register(RegisterRequest registerRequest);

    /**
     * 登录业务
     */
    User login(LoginRequest loginRequest, HttpServletRequest request);

    /**
     * 获取当前登录用户业务
     */
    User getLoginUser(HttpServletRequest request);

    /**
     * 退出登录业务
     */
    void logout(HttpServletRequest request);

    /**
     * 数据脱敏
     */
    UserVO ObjToVO(User user);

    /**
     * 添加用户业务（已废弃）
     */
    @Deprecated(since = "1.1.0")
    long addUser(UserAddRequest userAddRequest);

    /**
     * 添加用户业务(新)
     */
    long addUser(UserAddRequest userAddRequest, User loginUser);


    /**
     * 删除用户业务（已废弃）
     */
    @Deprecated(since = "1.1.0")
    void deleteUser(UserDeleteRequest userDeleteRequest);

    /**
     * 删除用户业务（新）
     */
    void deleteUser(UserDeleteRequest userDeleteRequest, User loginUser);

    /**
     * 修改用户业务（已废弃）
     */
    @Deprecated(since = "1.1.0")
    void updateUser(UserUpdateRequest userUpdateRequest);

    /**
     * 修改用户业务（新）
     */
    void updateUser(UserUpdateRequest userUpdateRequest, User loginUser);

    /**
     * 编辑用户业务（用户，必须本人）
     */
    void editUser(UserEditRequest userEditRequest, User loginUser);

    /**
     * 根据id获取用户 (管理员)
     */
    User getUserById(long userID);

    /**
     * 分页获取用户 (管理员)
     */
    Page<User> listUserByPage(UserPageQueryRequest userPageQueryRequest);

    /**
     * 批量数据脱敏
     */
    List<UserVO> ObjToVO(List<User> users);

    /**
     * 修改密码 (用户，必须本人)
     */
    void editPassword(UserEditPasswordRequest userEditPasswordRequest, HttpServletRequest request);

    /**
     * 设置头像（本人）
     */
    void setAvatar(long userId, long pictureId, User loginUser);
}
